package Day12.方法的递归调用;

/**
 * 介绍：递归就是方法自己调用自己，每次调用是传入不用的变量，递归能有助于我们解决复杂问题，同时也可以让代码变得简洁
 * 都能解决什么问题？
 * 各种数学问题：8皇后的问题，汉诺塔的问题，阶乘问题，迷宫问题，球和篮子的问题
 * 1.打印问题
 * 2.阶乘问题
 * 递归的重要规则
 * 1.创建一个方法的时候，就创建了一个新的受保护的独立空间（栈空间）
 * 2.方法的局部变量是独立的，不会相互影响
 * 3.如果方法中使用的是引用类型变量（比如 数组，对象），就会共享该引用类型的数据
 * 4.递归必须向这个退出递归的条件逼近，否则就会无限递归，出现 死龟
 * 5.当一个方法执行完毕，或者说遇到return就会返回，遵守谁调用，就将结果返回给谁，同时当方法执行完毕或者返回的时候，
 * 该方法也就执行完毕
 */
public class Demo01 {
    public static void main(String[] args) {
        T t1=new T();
        t1.test(4);//输出n=2 n=3 n=4
        int res=t1.factorial(5);
        System.out.println("5的阶乘="+res);
    }
}
class T{
    //分析
    public void test(int n){
        if (n>2){
            test(n-1);
        }
        System.out.println("n="+n);
    }
    //factorial阶乘问题
    public int factorial(int n){
        if (n==1){
            return 1;
        }else {
            return factorial(n-1)*n;
        }
    }
}
